package com.crm.service.contractManager;

import com.crm.model.entity.contractManager.CustomerContract;
import com.crm.model.entity.contractManager.RepaymentAbility;
import com.crm.model.qo.contractManager.CustomerContractQO;
import com.crm.model.qo.customerManager.AnalyseCustomerQO;
import com.crm.model.vo.csd.customerManager.ContractDetailVO;
import com.crm.model.vo.customerContractManager.*;
import com.crm.model.vo.datasearch.DataSearchResultVO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author  yincuimei
 * @Date 2021/3/12 9:59
 * 合同管理
 */
public interface CustomerContractDbService {

    /**
     * (超级管理员、普通管理员)合同管理--合同列表
     * @param customerContractQO ---合同列表查询条件
     * @param orderStr           ---合同列表排序
     * @param accountId          ---当前登录人账号ID(查询个人数据时)改为调用selectUserCustomerContractVOList
     * @param companyId          ---当前登录人所属公司ID(普通管理员查询本公司数据时)
     * @author yincuimei
     * @return
     */
    List<CustomerContractVO> selectCustomerContractVOList(CustomerContractQO customerContractQO,Integer dateUnit,String orderStr,String accountId,String companyId);

    /**
     * (用户系统)合同管理--合同列表
     * @param customerContractQO   ---查询条件
     * @param dateUnit             ---全部、上月、本周、本月、本年查询条件
     * @param orderStr             ---排序
     * @param accountId            ---当前登录人账号ID
     * @return
     */
    List<CustomerContractVO> selectUserCustomerContractVOList(CustomerContractQO customerContractQO,Integer dateUnit,String orderStr,String accountId);

    /**
     * 合同列表--查看(根据合同ID查询合同详情)
     * @param contractId  ---合同ID
     * @author yincuimei
     * @return
     */
    CustomerContractDetailVO selectCustomerContractVODetail(String contractId);

    /**
     * 合同作废时后端校验合同状态及回款状态
     * @param contractId
     * @return
     */
    Map selectContractAndPaymentStatus(String contractId);

    /**
     * 合同列表--修改合同状态
     * @param contractId  ---合同ID
     * @param contractStatus ---合同状态
     * @author yincuimei
     * @return
     */
    Boolean updateContractStatusById(String contractId,String contractStatus);

    /**
     * 合同详情(用户系统)--上传补充材料
     * @param customerContract  ---合同信息
     * @author yincuimei
     * @return
     */
    Boolean updateContractReplenishAnnex(CustomerContract customerContract);

    /**
     * 通过客户id查询合同列表
     * @param customerId 客户id
     * @param accountId 用户id
     * @author luojie
     * @return
     */
    List<CustomerContract> selectContractListByCustomerId(String customerId,String accountId);

    /**
     * 新增合同
     * @param customerContract  合同对象
     * @author luojie
     * @return
     */
    Boolean insertCustomerContract(CustomerContract customerContract);

    /**
     * 更新合同表数据
     * @param customerContract 合同对象
     * @author luojie
     * @return
     */
    Boolean updateCustomerContract(CustomerContract customerContract);


    /**
     * 联系人详情-订单合同-通过联系人id
     * @param contactId 联系人id
     * @param contractNumber 合同编号
     * @param order 分组类型
     * @return
     */
    List<ContactDetailByCustomerContractVO> selectCustomerContractByContactId(String contactId, String contractNumber, String order);

    /**
     * 更新合同审核状态
     * @param contractId 合同id
     * @param contractReviewStatus 合同审核状态
     * @return
     */
    Boolean updateContractReviewStatus(String contractId, String contractReviewStatus, String accountId, String userName, String contractReviewNotes, Date newDate);

    /**
     * 查询新单会员数量
     * @param qo
     * @return
     */
    List<Long> selectNewVipCount(AnalyseCustomerQO qo);

    /**
     * 查询续费会员合同
     * @param qo
     * @return
     */
    List<Long> selectRenewalVipCount(AnalyseCustomerQO qo);

    /**
     * 会员合同数量
     * @return
     */
    BigDecimal selectMackAddVipCount(AnalyseCustomerQO qo);

    /**
     * 续费合同数量
     * @param qo
     * @return
     */
    BigDecimal selectRenewalVip(AnalyseCustomerQO qo);

    /**
     * 会员订单总数量
     * @param qo
     * @return
     */
    Long selectMakeVipCount(AnalyseCustomerQO qo);

    /**
     * 计算客户转换排名
     * @param qo
     * @return
     */
    Long selectCustomerSwitchNum(AnalyseCustomerQO qo);

    /**
     * 计算会员拥有排名
     * @param qo
     * @return
     */
    Long selectVipOwnNum(AnalyseCustomerQO qo);

    /***
     * @Description:根据合同id查询合同信息
     * @Param: contractId
     * @Author: luojie
     * @Date: 2021/4/19 8:40
     */
    CustomerContract selectContractById(String contractId);

    /**
     * 根据合同编号查询合同信息
     * @param contractNumber 合同编号
     * @return
     */
    CustomerContract selectContractByContractNumber(String contractNumber);

    /***
     * @Description:查询未回款合同
     * @Author: luojie
     * @Date: 2021/4/26 9:49
     */
    List<CustomerContract> selectUnpaidContract();

    /**
     * 根据会员id查询会员的开始时间和结束时间
     * @param customerId
     * @return
     */
    CustomerContractVO getCustomerVipDateByCustomerId(String customerId);

    /**
     * 商机详情-查询商机客户下面未过期的合同
     * @param customerId 客户id
     * @return
     */
    List<CustomerContractVO> selectByCustomerId(String customerId);


    /**
     * @Description: 通过合同编号获取数据
     * @Param: [contractNum]
     * @Return: java.util.List<com.crm.model.vo.datasearch.DataSearchResultVO>
     * @Author: lixq-f
     * @Date: 2021/5/13
     **/
    List<DataSearchResultVO> selectDataByContractNum(String contractNum);

    /**
     * 更新合同全部字段
     * @param contract
     */
    void updateByPrimaryKey(CustomerContract contract);


    /**
     * @Description: 查询单品合同列表
     * @Param: [customerContractQO, orderStr]
     * @Return: java.util.List<com.crm.model.vo.customerContractManager.CustomerContractVO>
     * @Author: lixq-f
     * @Date: 2021/6/17
    **/
    List<CustomerContractVO> selectSingleContractList(CustomerContractQO customerContractQO,
                                                      String orderStr);

    /**
     * 通过联系人id查询合同信息
     * @param contactId 联系人id
     * @return
     */
    List<CustomerContract> selectByContactId(String contactId);


    /**
     * 全局更新合同表数据
     * @param customerContract 合同对象
     * @author luojie
     * @return
     */
    Boolean updateCustomerContractWithAllModel(CustomerContract customerContract);

    /**
     * 通过订单id查询合同信息
     * @param productOrderId 订单id
     * @return
     */
    CustomerContract selectContractByOrderId(String productOrderId);

    /**
     * (客服部)-》客户列表-》查看-》合同&订单-》编辑合同详情
     * @param contractId --合同ID
     * @author yincuimei
     * @return
     */
    ContractDetailVO selectContractDetailVOById(String contractId);

    /**
     * 根据客户id查询合同列表
     * @param customerId 客户id
     * @param order 排序
     * @param auditStatusList 联系人审核状态
     * @param onTheJobSituationList 职业状态
     * @author 罗杰
     * @return
     */
    List<ContractContactVO> selectContractContactByCustomerId(String customerId, String order, List<Integer> auditStatusList, List<Integer> onTheJobSituationList);

    /**
     * (客服部)-编辑客户时查询合同表生效中合同的开始日期及结束日期
     * @param customerId
     * @author yincuimei
     * @return
     */
    List<Map<String, Date>> selectCustomerContractByCustomerId(String customerId);

    /**
     *  批量补充合同表客户信息(临时用补充正式库数据:customer_id;customer_name为空的)
     * @param customerContractList
     * @author yincuimei
     * @Date(2021-9-26)
     * @return
     */
    Boolean batchUpdateCustomerContractByIds(List<CustomerContract> customerContractList);

    /**
     * 查询最近三个月内的合同列表
     * @return
     */
    List<ContractLastThreeMonthVO> selectLastThreeMonthsContractList(String accountId);

    /**
     * 修改合同到款时间及其他可选信息
     * @Param customerContract
     * @Author xielinqi
     * @Date 2:36 下午 2021/11/9
     */
    int updateArriveTimeAndOtherSelectiveInfo(CustomerContract customerContract);

    /**
     * @author chengyun
     * @date 2021年11月18日 下午 16:39:49
     * info 根据合同类型统计上月会员合同数量 未删除 生效中
     * @param contractTypeArr 合同类型
     * @return
     */
    List<Map<String, String>> statisticalVipContractCount(char[] contractTypeArr);

    /**
     * @author chengyun
     * @date 2021年11月18日 下午 16:39:49
     * info 根据合同类型统计上月会员合同数量 未删除 生效中
     * @param contractTypeArr 合同类型
     * @return
     */
    List<Map<String, Object>> statisticalVipContractCountAll(char[] contractTypeArr);

    /**
     * 回款能力
     * @param dateStr
     * @param accountId
     * @return
     */
    RepaymentAbility getRepaymentAbility(String dateStr , String accountId);


    /**
     * 客户详情查询合同列表
     * @param customerId 客户id
     * @param accountId 用户id
     * @return
     */
    List<CustomerContractVO> selectContractByCustomerId(String customerId, String accountId,String createId);

    /**
     * 通过商机id查询
     * @param opportunityId
     * @return
     */
    CustomerContract selectByOpportunityId(String opportunityId);

    /**
     * 客服首页-合同未审核数量
     * @Author renshaorong
     * @Date 2021/12/16
     * @return
     */
    Integer getCustomerContractNum();

    /**
     * 创建会员统计
     * @param year
     * @return
     */
    List<Map<String, Object>> getContractNumByCreate(Integer year);

    /**
     * 通过/未通过会员统计
     * @param year
     * @return
     */
    List<Map<String, Object>> getContractNumByPass(Integer year, Integer pathStatus);

    /**
     * 生效会员统计
     * @param year
     * @return
     */
    List<Map<String, Object>> getContractNumByEffect(@Param("year") Integer year);
}
